package com.obelisco.vista.seguridad;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Vector;

import nextapp.echo2.app.event.ActionEvent;
import nextapp.echo2.app.event.ActionListener;

import com.obelisco.modelo.data.CarpetaTransaccion;
import com.obelisco.modelo.data.Transaccion;

import echopointng.Tree;
import echopointng.tree.DefaultMutableTreeNode;
import echopointng.tree.DefaultTreeModel;
import echopointng.tree.TreeActionEventEx;
import echopointng.tree.TreeSelectionModel;

public class ArbolSeguridad extends Tree {

	private CarpetaTransaccion raiz;

	DefaultTreeModel treeModel;

	private HashMap invokerMap;

	private boolean generando = true;

	private Vector<EjecutarListener> listeners = new Vector<EjecutarListener>();

	private Vector<ArbolSeguridadListener> listenersArbol = new Vector<ArbolSeguridadListener>();

	public ArbolSeguridad() {
		super();
		initComponents();
	}

	ActionListener manejoArbol = new ActionListener() {

		public void actionPerformed(ActionEvent e) {

			if (e instanceof TreeActionEventEx) {
				TreeActionEventEx e1 = (TreeActionEventEx) e;

				Object nodo = e1.getTreeNode();
				
				if (nodo instanceof TreeNodeCarpeta) {
					CarpetaTransaccion nodoCarpeta = ((TreeNodeCarpeta) nodo)
							.getCarpeta();
					distribuirEventoCarpeta(nodoCarpeta);

				} else if (nodo instanceof TreeNodeTransaccion) {
					Transaccion nodoTran = ((TreeNodeTransaccion) nodo)
							.getTransaccion();
					distribuirEventoTransaccion(nodoTran);
				}

			}
		}

	};

	private void initComponents() {
		this.addActionListener(manejoArbol);
	}

	public void addEjecutarListener(EjecutarListener listener) {
		listeners.add(listener);
	}

	public void removeEjecutarListener(EjecutarListener listener) {
		listeners.remove(listener);
	}

	public void addArbolSeguridadListener(ArbolSeguridadListener listener) {
		listenersArbol.add(listener);
	}

	public void removeArbolSeguridadListener(ArbolSeguridadListener listener) {
		listenersArbol.remove(listener);
	}

	public void distribuirCambiarNodo(TreeNodeCustom nodo, Object objeto) {

		for (Iterator i = listenersArbol.iterator(); i.hasNext();) {
			ArbolSeguridadListener l = (ArbolSeguridadListener) i.next();
			l.onChangeNode(nodo, objeto);
		}

	}

	public void distribuirEventoTransaccion(Transaccion t) {

		for (Iterator i = listeners.iterator(); i.hasNext();) {
			EjecutarListener l = (EjecutarListener) i.next();
			l.onClickTransaccion(t);
		}

	}

	public void distribuirEventoCarpeta(CarpetaTransaccion c) {

		for (Iterator i = listeners.iterator(); i.hasNext();) {
			EjecutarListener l = (EjecutarListener) i.next();
			l.onClickCarpeta(c);
		}

	}

	private DefaultMutableTreeNode crearRama(DefaultMutableTreeNode padre,
			CarpetaTransaccion carpeta) {

		TreeNodeCarpeta hijo = new TreeNodeCarpeta(carpeta);
		distribuirCambiarNodo(hijo, carpeta);

		// DefaultMutableTreeNode hijo = new DefaultMutableTreeNode(carpeta
		// .getNombre());

		hijo.setActionCommand("C" + carpeta.getCodigo());
		invokerMap.put("C" + carpeta.getCodigo(), carpeta);

		if (padre == null) {
			padre = hijo;
		} else {
			padre.add(hijo);
		}

		for (Iterator i = carpeta.getHijos().iterator(); i.hasNext();) {
			CarpetaTransaccion c = (CarpetaTransaccion) i.next();
			crearRama(hijo, c);
		}

		// Se crean las Transacciones
		for (Iterator i = carpeta.getTransacciones().iterator(); i.hasNext();) {
			Transaccion t = (Transaccion) i.next();

			TreeNodeTransaccion testNode = new TreeNodeTransaccion(t);
			distribuirCambiarNodo(testNode, t);

			testNode.setActionCommand("T" + t.getCodigo());
			invokerMap.put("T" + t.getCodigo(), t);

			hijo.add(testNode);

		}

		return padre;
	}

	public CarpetaTransaccion getRaiz() {
		return raiz;
	}

	public synchronized void setRaiz(CarpetaTransaccion raiz) {
		this.raiz = raiz;
		if (raiz != null) {

			// this.setId(Aplicacion.getApp().generateId());

			invokerMap = new HashMap();

			DefaultMutableTreeNode root = crearRama(null, raiz);

			treeModel = new DefaultTreeModel(root);

			setModel(treeModel);

			TreeSelectionModel selectionModel = this.getSelectionModel();
			selectionModel.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);

			distribuirEventoCarpeta(raiz);
		}

	}

}
